package com.malou.server.seguridad.usuario;

import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.ibatis.sqlmap.client.SqlMapClient;
import com.malou.client.seguridad.usuario.Privilegio;
import com.malou.client.seguridad.usuario.Rol;
import com.malou.client.seguridad.usuario.Usuario;
import com.malou.client.util.Utilities;
import com.malou.server.base.Conexion;
import com.malou.server.pagos.pagoletras.Letras;

public class Usuarios {
	
	private static SqlMapClient sqlMap = null;
	public static Integer errorTipo = 0;
	
	public static Usuario validarResponsable(Usuario tda){
		        
        SqlMapClient sqlMap = null;
		
		sqlMap = Conexion.getSqlMap();
		
		Usuario val = null;
		try {
			val = (Usuario) sqlMap.queryForObject("validarresponsable", tda);
		} catch (SQLException e) {	
			val = new Usuario(true,e.getSQLState()+" "+ e.getMessage());
			e.printStackTrace();
		}
        return val;
	}
	
	public static Usuario getResponsable(String username){
		        
        SqlMapClient sqlMap = null;
		
		sqlMap = Conexion.getSqlMap();
		
        Usuario val = null;
		try {
			
			val = (Usuario) sqlMap.queryForObject("getResponsable", username);
			
			
			
			if(Letras.getActivar())
				val.setActivado(true);
			else
				val.setActivado(false);
			
		} catch (SQLException e) {			
			e.printStackTrace();
		}
        
        return val;
	}
	
	@SuppressWarnings("unchecked")
	public static Usuario getTreeUsuario(Usuario user){		     
        
        sqlMap = Conexion.getSqlMap();
        List<Usuario> users = null;
       
		try {
			if (user == null)
				users = sqlMap.queryForList("getRolesRaiz", null);				
			else if(user.getHaschildren() == null && user.getHasusers() != null){	
				users = sqlMap.queryForList("getUsuarios", user);
			}else if(user.getHaschildren() != null && user.getHasusers() == null){
				users = sqlMap.queryForList("getRolesHijos", user);
			}else if(user.getHaschildren() != null && user.getHasusers() != null){
				users = sqlMap.queryForList("getRolesUsuarios", user);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		Usuario root = new Usuario();
		for (int i = 0; i < users.size(); i++) {
			Usuario usuario = (Usuario) users.get(i);			
			root.add(usuario);
	    }
	    return root;
	}
	
	public static boolean saveGroup(Usuario user){
		boolean retorno = true;	   
		
		sqlMap = Conexion.getSqlMap();
		try {
			if(validaDescripcionGroup(user)){
				
				if(user.getId() != null)
					sqlMap.update("updateRol", user);
				else{
					sqlMap.startTransaction();
					if(user.getParent_id() != null){					
						sqlMap.update("updateRolPadre", user);
						
					}
					
					sqlMap.insert("insertRol", user);
					sqlMap.commitTransaction();				
				}
			}else
				retorno = false;
			
		} catch (SQLException e) {
			retorno = false;
			e.printStackTrace();			
		}
		
		try {
			sqlMap.endTransaction();
		} catch (SQLException e1) {				
			e1.printStackTrace();
		}
		
		return retorno;
	}
	
	private static boolean validaDescripcionGroup(Usuario user){
		boolean retorno = true;		
		
		try {
			if(user.getId() == null)
				user.setId(0);
			
			Integer cant = (Integer)sqlMap.queryForObject("validaDescripcionRol", user);
			
			if(user.getId() == 0)
				user.setId(null);
			
			if(cant != 0){
	            retorno = false;
	            errorTipo = 1;//Este rol ya existe en el nivel	            
	        }
		} catch (SQLException e) {
			retorno = false;
			e.printStackTrace();			
		}
		
		return retorno;
	}
	
	public static boolean deleteGroup(Integer id){
		boolean retorno = true;
		     
		
		sqlMap = Conexion.getSqlMap();		
		
		try {
			sqlMap.startTransaction();
			Usuario user = (Usuario)sqlMap.queryForObject("getRol", id);
			Integer parent_id = user.getParent_id();
			if(parent_id != null){
				Integer cant = (Integer)sqlMap.queryForObject("getCountRolesHijos", parent_id);;
				
				if(cant == 1)
					sqlMap.update("updateRolSinHijos", parent_id);
			}
			if(id != null)
				sqlMap.delete("deleteRol", id);
			else
				retorno = false;
			sqlMap.commitTransaction();
		} catch (SQLException e) {
			retorno = false;
			e.printStackTrace();			
		}
		
		try {
			sqlMap.endTransaction();
		} catch (SQLException e1) {				
			e1.printStackTrace();
		}
		return retorno;
	}
	
	public static boolean saveUser(Usuario user){
		boolean retorno = true;		  
		
		sqlMap = Conexion.getSqlMap();
		try {
			sqlMap.startTransaction();
			if(validaDescripcion(user)){
				
				if(user.getId() != null)
					if(user.getClave() == null)
						sqlMap.update("updateUsuario", user);
					else
						sqlMap.update("updateUsuarioClave", user);	
				else{
					sqlMap.insert("insertUsuario", user);
					sqlMap.insert("insertUsuarioRol", user);
					if(user.getParent_id() != null){					
						sqlMap.update("updateRolUsuario", user);
						
					}
				}				
			}else{
				retorno = false;				
			}
			sqlMap.commitTransaction();
			
		} catch (SQLException e) {
			retorno = false;
			e.printStackTrace();			
		}
		
		try {
			sqlMap.endTransaction();
		} catch (SQLException e1) {				
			e1.printStackTrace();
		}
		
		return retorno;
	}
	
	private static boolean validaDescripcion(Usuario user){
		boolean retorno = true;		
		
		try {
			if(user.getId() == null)
				user.setId(0);
			Integer cant = (Integer)sqlMap.queryForObject("validaDescripcionUsuario", user);			
			if(user.getId() == 0)
				user.setId(null);
			if(cant != 0){
	            retorno = false;
	            errorTipo = 1;//Este usuario ya existe	            
	        }
		} catch (SQLException e) {
			retorno = false;
			e.printStackTrace();			
		}
		
		return retorno;
	}
	
	public static boolean deleteUser(Integer id, Integer rol_id){
		boolean retorno = true;		     
		
		sqlMap = Conexion.getSqlMap();
		try {
			sqlMap.startTransaction();
			if(rol_id != null){
				Integer cant = (Integer)sqlMap.queryForObject("getCountRolesUsuarios", rol_id);
				
				if(cant == 1)					
					sqlMap.update("updateRolSinUsuarios", rol_id);				
			}
			
			if(id != null){
				Integer cant = (Integer)sqlMap.queryForObject("getCountUsuariosRoles", id);
				if(cant == 1)
					sqlMap.delete("deleteUsuario", id);
				else{
					Map<String,Integer> m = new HashMap<String,Integer>(2);
					m.put("usuario_id", id);
					m.put("rol_id", rol_id);
					sqlMap.delete("deleteUsuarioRol", m);
				}
			}else
				retorno = false;
			sqlMap.commitTransaction();
		} catch (SQLException e) {
			retorno = false;
			e.printStackTrace();			
		}
		
		try {
			sqlMap.endTransaction();
		} catch (SQLException e1) {				
			e1.printStackTrace();
		}
		
		return retorno;
	}
		
	@SuppressWarnings("unchecked")
	public static List<Rol> getRoles(Integer id){		
        SqlMapClient sqlMap = null;
		
		sqlMap = Conexion.getSqlMap();
		
        List<Rol> data = null;
		try {
			data = sqlMap.queryForList("getAllRolesId", id);				
		} catch (SQLException e) {
			e.printStackTrace();
		}
        return data;
	}
	
	@SuppressWarnings("rawtypes")
	public static boolean modificarRoles(Integer user_id, List<Integer> roles_id){
		boolean retorno = true;		   
		Map<String,Integer> m;		
		
		sqlMap = Conexion.getSqlMap();
		try {		
			
			sqlMap.startTransaction();			
			
			for(Integer rol_id : roles_id){
				m = new HashMap<String,Integer>(2);
				m.put("usuario_id", user_id);
				m.put("rol_id", rol_id);
				
				Integer cant = (Integer)sqlMap.queryForObject("isInUsuariosRoles", m);				
				if(cant == 0){
					sqlMap.insert("insertUsuarioRoles", m);
					sqlMap.update("updateRolHasUsuario", rol_id);
				}	
			}
			String rol_ids = Utilities.toIdString(roles_id);
			Usuario user = new Usuario();
			user.setId(user_id);
			user.setClave(rol_ids);
			List data = sqlMap.queryForList("forDeleteRolesUsuario", user);
			for(int i = 0; i < data.size(); i++) {
				Map map = (HashMap)data.get(i);
				Integer rol_id = Integer.parseInt(map.get("rol_id").toString());
				Integer usuario_id = Integer.parseInt(map.get("usuario_id").toString());
				
				Integer cant = (Integer)sqlMap.queryForObject("getCountRolesUsuarios", rol_id);
				
				if(cant == 1)					
					sqlMap.update("updateRolSinUsuarios", rol_id);	
				
				m = new HashMap<String,Integer>(2);
				m.put("usuario_id", usuario_id);
				m.put("rol_id", rol_id);
				sqlMap.delete("deleteUsuarioRol", m);
			}
			
			
			sqlMap.commitTransaction();			
			
		} catch (SQLException e) {
			retorno = false;
			e.printStackTrace();			
		}
		
		try {
			sqlMap.endTransaction();
		} catch (SQLException e1) {				
			e1.printStackTrace();
		}
		
		return retorno;
	}
	
	@SuppressWarnings("unchecked")
	public static List<Privilegio> getPrivilegios(){		
        SqlMapClient sqlMap = null;
		
		sqlMap = Conexion.getSqlMap();
		
        List<Privilegio> data = null;
     
		try {
			data = sqlMap.queryForList("getPrivilegios", null);				
		} catch (SQLException e) {
			e.printStackTrace();
		}
        return data;
	}
}